package cn.colat.micse.user.service.user.impl;

import cn.colat.micse.common.constant.RedisConstant;
import cn.colat.micse.common.utils.AssertUtil;
import cn.colat.micse.common.utils.MD5Utils;
import cn.colat.micse.user.entity.User;
import cn.colat.micse.user.mapper.UserMapper;
import cn.colat.micse.user.pojo.dto.UserInfoDTO;
import cn.colat.micse.user.pojo.vo.AccountLoginVO;
import cn.colat.micse.user.pojo.vo.AccountPhoneLoginVO;
import cn.colat.micse.user.pojo.vo.SendSmsVO;
import cn.colat.micse.user.service.user.UserService;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

/**
 * t_user Service实现
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    /**
     * 配置文件中配置是否发送手机短信验证码 默认为false
     */
    // @Value("user-app.user.enable-send-sms")
    private final Boolean enableSendSms = false;


    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 用户账号登录
     *
     * @param vo 登录账号、登录识别码
     * @return 登录后的token信息
     */
    @Override
    public SaTokenInfo accountLogin(AccountLoginVO vo) {
        User user = userMapper.queryByUserName(vo.getUsername());
        AssertUtil.objIsNull(user, "用户不存在");
        AssertUtil.checkBoolean(MD5Utils.isEquals(vo.getPassword(), user.getIdentityCode()), "用户名或密码错误");
        StpUtil.login(user.getId(), vo.getDevice());
        return StpUtil.getTokenInfo();
    }

    /**
     * 获取用户信息
     *
     * @return 用户基本信息
     */
    @Override
    public UserInfoDTO userInfo() {
        Long userId = StpUtil.getLoginIdAsLong();
        User user = userMapper.selectById(userId);
        AssertUtil.objIsNull(user, "用户不存在");
        UserInfoDTO dto = new UserInfoDTO();
        BeanUtils.copyProperties(user, dto);
        return dto;
    }

    /**
     * 发送手机验证码
     *
     * @param vo 发送验证码参数
     */
    @Override
    public void sendSms(SendSmsVO vo) {
        // 查询还有没有这个验证码
        Object codeObj = redisTemplate.opsForValue().get(RedisConstant.SMS_CODE_PHONE + vo.getPhone());
        // 如果不是null
        if (null != codeObj) {

        }
        if (enableSendSms) {
            // TODO 发送手机验证码
        } else {
            String code = "666666";
        }

    }

    /**
     * 手机号登录
     *
     * @param vo 手机号登录参数
     * @return Sa-Token信息
     */
    @Override
    public SaTokenInfo phoneLogin(AccountPhoneLoginVO vo) {
        return null;
    }
}




